1 package edu.jiangxin.apktoolbox.convert.color;
2
3 import edu.jiangxin.apktoolbox.convert.color.colortable.IColorTable;
4 import edu.jiangxin.apktoolbox.convert.color.colortable.OrdinaryColorTable;
5 import edu.jiangxin.apktoolbox.convert.color.colortable.RalColorTable;
6 import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
7 import edu.jiangxin.apktoolbox.utils.Constants;
8
9 import javax.swing.*;
10 import javax.swing.event.ChangeEvent;
11 import javax.swing.event.ChangeListener;
12 import javax.swing.event.DocumentEvent;
13 import javax.swing.event.DocumentListener;
14 import javax.swing.table.DefaultTableCellRenderer;
15 import javax.swing.table.DefaultTableModel;
16 import java.awt.*;
17 import java.io.Serial;
18
19 public class ColorConvertPanel extends EasyPanel {
20 @Serial
21 private static final long serialVersionUID = 1L;
22
23 private Color color;
24
25 private JSpinner redSpinner;
26
27 private JSpinner greenInRgbSpinner;
28
29 private JSpinner blueInRgbSpinner;
30
31 private JTextField hexInRgbTextField;
32
33 private JSpinner hueInHsbSpinner;
34
35 private JSpinner saturationInHsbSpinner;
36
37 private JSpinner brightnessInHsbSpinner;
38
39 private JSpinner hueInHslSpinner;
40
41 private JSpinner saturationInHslSpinner;
42
43 private JSpinner lightnessInHslSpinner;
44
45 private JSpinner cyanInCmykSpinner;
46
47 private JSpinner magentaInCmykSpinner;
48
49 private JSpinner yellowInCmykSpinner;
50
51 private JSpinner blackInCmykSpinner;
52
53 private JSpinner lInCielabSpinner;
54
55 private JSpinner aInCielabSpinner;
56
57 private JSpinner bInCielabSpinner;
58
59 private JTextField colorBoxTextField;
60
61 private JComboBox<IColorTable> colorTableTypeComboBox;
62
63 private JTable colorTable;
64
65 private boolean isChangedByUser = true;
66
67 public ColorConvertPanel() throws HeadlessException {
68 super();
69 }
70
71 @Override
72 public void initUI() {
73 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
74 createColorBoxPanel();
75
76 BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
77 setLayout(boxLayout);
78
79 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
80 createRgbPanel();
81
82 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
83 createHsbPanel();
84
85 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
86 createHslPanel();
87
88 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
89 createCmykPanel();
90
91 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
92 createCielabPanel();
93
94 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
95 createColorTablePanel();
96 }
97
98 public void createColorBoxPanel() {
99 JPanel colorBoxPanel = new JPanel();
100 add(colorBoxPanel);
101 colorBoxPanel.setLayout(new BorderLayout());
102 colorBoxPanel.setBorder(BorderFactory.createTitledBorder("Color Box"));
103
104 JPanel xPanel = new JPanel();
105 colorBoxPanel.add(xPanel);
106 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
107
108 colorBoxTextField = new JTextField();
109 colorBoxTextField.setEditable(false);
110 colorBoxTextField.setOpaque(false);
111
112 xPanel.add(colorBoxTextField);
113 }
114
115 private void createRgbPanel() {
116 JPanel rgbPanel = new JPanel();
117 add(rgbPanel);
118 rgbPanel.setLayout(new BorderLayout());
119 rgbPanel.setBorder(BorderFactory.createTitledBorder("RGB"));
120
121 JPanel xPanel = new JPanel();
122 rgbPanel.add(xPanel);
123 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
124
125 JLabel rebLabel = new JLabel("R(Red, [0-255])");
126 redSpinner = new JSpinner();
127 redSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
128 redSpinner.addChangeListener(new RgbChangeListener());
129
130 JLabel greenLabel = new JLabel("G(Green, [0-255])");
131 greenInRgbSpinner = new JSpinner();
132 greenInRgbSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
133 greenInRgbSpinner.addChangeListener(new RgbChangeListener());
134
135 JLabel blueLabel = new JLabel("B(Blue, [0-255])");
136 blueInRgbSpinner = new JSpinner();
137 blueInRgbSpinner.setModel(new SpinnerNumberModel(0, 0, 255, 1));
138 blueInRgbSpinner.addChangeListener(new RgbChangeListener());
139
140 JLabel hexLabel = new JLabel("Hex");
141 hexInRgbTextField = new JTextField();
142 hexInRgbTextField.setToolTipText("0xFFFFFF格式常用在通用语言中(Java/C++等), #FFFFFF格式常用在标记语言中(XML/HTML等)");
143 hexInRgbTextField.setEditable(true);
144 hexInRgbTextField.getDocument().addDocumentListener(new HexDocumentListener());
145
146 xPanel.add(rebLabel);
147 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
148 xPanel.add(redSpinner);
149 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
150 xPanel.add(greenLabel);
151 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
152 xPanel.add(greenInRgbSpinner);
153 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
154 xPanel.add(blueLabel);
155 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
156 xPanel.add(blueInRgbSpinner);
157 xPanel.add(Box.createHorizontalStrut(3 * Constants.DEFAULT_X_BORDER));
158 xPanel.add(hexLabel);
159 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
160 xPanel.add(hexInRgbTextField);
161 }
162
163 private void createHsbPanel() {
164 JPanel hsbPanel = new JPanel();
165 add(hsbPanel);
166 hsbPanel.setLayout(new BorderLayout());
167 hsbPanel.setBorder(BorderFactory.createTitledBorder("HSB/HSV"));
168
169 JPanel xPanel = new JPanel();
170 hsbPanel.add(xPanel);
171 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
172
173 JLabel hueLabel = new JLabel("H(Hue, [0-360])");
174 hueInHsbSpinner = new JSpinner();
175 hueInHsbSpinner.setModel(new SpinnerNumberModel(0, 0, 360, 1));
176 hueInHsbSpinner.addChangeListener(new HsbChangeListener());
177
178 JLabel saturationLabel = new JLabel("S(Saturation, [0-100])");
179 saturationInHsbSpinner = new JSpinner();
180 saturationInHsbSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
181 saturationInHsbSpinner.addChangeListener(new HsbChangeListener());
182
183
184 JLabel brightnessLabel = new JLabel("B/V(Brightness/Value, [0-100])");
185 brightnessInHsbSpinner = new JSpinner();
186 brightnessInHsbSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
187 brightnessInHsbSpinner.addChangeListener(new HsbChangeListener());
188
189 xPanel.add(hueLabel);
190 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
191 xPanel.add(hueInHsbSpinner);
192 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
193 xPanel.add(saturationLabel);
194 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
195 xPanel.add(saturationInHsbSpinner);
196 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
197 xPanel.add(brightnessLabel);
198 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
199 xPanel.add(brightnessInHsbSpinner);
200 }
201
202 private void createHslPanel() {
203 JPanel hslPanel = new JPanel();
204 add(hslPanel);
205 hslPanel.setLayout(new BorderLayout());
206 hslPanel.setBorder(BorderFactory.createTitledBorder("HSL"));
207
208 JPanel xPanel = new JPanel();
209 hslPanel.add(xPanel);
210 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
211
212 JLabel hueLabel = new JLabel("H(Hue, [0-360])");
213 hueInHslSpinner = new JSpinner();
214 hueInHslSpinner.setModel(new SpinnerNumberModel(0, 0, 360, 1));
215 hueInHslSpinner.addChangeListener(new HslChangeListener());
216
217 JLabel saturationLabel = new JLabel("S(Saturation, [0-100])");
218 saturationInHslSpinner = new JSpinner();
219 saturationInHslSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
220 saturationInHslSpinner.addChangeListener(new HslChangeListener());
221
222
223 JLabel lightnessLabel = new JLabel("L(Lightness, [0-100])");
224 lightnessInHslSpinner = new JSpinner();
225 lightnessInHslSpinner.setModel(new SpinnerNumberModel(50, 0, 100, 1));
226 lightnessInHslSpinner.addChangeListener(new HslChangeListener());
227
228 xPanel.add(hueLabel);
229 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
230 xPanel.add(hueInHslSpinner);
231 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
232 xPanel.add(saturationLabel);
233 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
234 xPanel.add(saturationInHslSpinner);
235 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
236 xPanel.add(lightnessLabel);
237 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
238 xPanel.add(lightnessInHslSpinner);
239 }
240
241 private void createCmykPanel() {
242 JPanel cmykPanel = new JPanel();
243 add(cmykPanel);
244 cmykPanel.setLayout(new BorderLayout());
245 cmykPanel.setBorder(BorderFactory.createTitledBorder("CMYK"));
246
247 JPanel xPanel = new JPanel();
248 cmykPanel.add(xPanel);
249 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
250
251 JLabel cyanLabel = new JLabel("C(Cyan, [0-100])");
252 cyanInCmykSpinner = new JSpinner();
253 cyanInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
254 cyanInCmykSpinner.addChangeListener(new CmykChangeListener());
255
256 JLabel magentaLabel = new JLabel("M(Magenta, [0-100])");
257 magentaInCmykSpinner = new JSpinner();
258 magentaInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
259 magentaInCmykSpinner.addChangeListener(new CmykChangeListener());
260
261
262 JLabel yellowLabel = new JLabel("Y(Yellow, [0-100])");
263 yellowInCmykSpinner = new JSpinner();
264 yellowInCmykSpinner.setModel(new SpinnerNumberModel(100, 0, 100, 1));
265 yellowInCmykSpinner.addChangeListener(new CmykChangeListener());
266
267 JLabel blackLabel = new JLabel("K(Black, [0-100])");
268 blackInCmykSpinner = new JSpinner();
269 blackInCmykSpinner.setModel(new SpinnerNumberModel(0, 0, 100, 1));
270 blackInCmykSpinner.addChangeListener(new CmykChangeListener());
271
272 xPanel.add(cyanLabel);
273 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
274 xPanel.add(cyanInCmykSpinner);
275 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
276 xPanel.add(magentaLabel);
277 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
278 xPanel.add(magentaInCmykSpinner);
279 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
280 xPanel.add(yellowLabel);
281 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
282 xPanel.add(yellowInCmykSpinner);
283 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
284 xPanel.add(blackLabel);
285 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
286 xPanel.add(blackInCmykSpinner);
287 }
288
289 private void createCielabPanel() {
290 JPanel cielabPanel = new JPanel();
291 add(cielabPanel);
292 cielabPanel.setLayout(new BorderLayout());
293 cielabPanel.setBorder(BorderFactory.createTitledBorder("CIELAB"));
294
295 JPanel xPanel = new JPanel();
296 cielabPanel.add(xPanel);
297 xPanel.setLayout(new BoxLayout(xPanel, BoxLayout.X_AXIS));
298
299 JLabel lLabel = new JLabel("L([0-100])");
300 lInCielabSpinner = new JSpinner();
301 lInCielabSpinner.setModel(new SpinnerNumberModel(50, 0, 100, 1));
302 lInCielabSpinner.addChangeListener(new CielabChangeListener());
303
304 JLabel magentaLabel = new JLabel("A([-128-127])");
305 aInCielabSpinner = new JSpinner();
306 aInCielabSpinner.setModel(new SpinnerNumberModel(0, -128, 127, 1));
307 aInCielabSpinner.addChangeListener(new CielabChangeListener());
308
309
310 JLabel yellowLabel = new JLabel("B([-128-127])");
311 bInCielabSpinner = new JSpinner();
312 bInCielabSpinner.setModel(new SpinnerNumberModel(0, -128, 127, 1));
313 bInCielabSpinner.addChangeListener(new CielabChangeListener());
314
315 xPanel.add(lLabel);
316 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
317 xPanel.add(lInCielabSpinner);
318 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
319 xPanel.add(magentaLabel);
320 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
321 xPanel.add(aInCielabSpinner);
322 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
323 xPanel.add(yellowLabel);
324 xPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
325 xPanel.add(bInCielabSpinner);
326 }
327
328 private void createColorTablePanel() {
329 JPanel colorTablePanel = new JPanel();
330 add(colorTablePanel);
331 colorTablePanel.setLayout(new BorderLayout());
332 colorTablePanel.setBorder(BorderFactory.createTitledBorder("Color Table"));
333
334 JPanel yPanel = new JPanel();
335 colorTablePanel.add(yPanel);
336 yPanel.setLayout(new BoxLayout(yPanel, BoxLayout.Y_AXIS));
337
338 colorTableTypeComboBox = new JComboBox<>();
339 IColorTable ordinaryColorTable = new OrdinaryColorTable();
340 IColorTable ralColorTable = new RalColorTable();
341 colorTableTypeComboBox.addItem(ordinaryColorTable);
342 colorTableTypeComboBox.addItem(ralColorTable);
343 colorTableTypeComboBox.setSelectedItem(ordinaryColorTable);
344 colorTableTypeComboBox.addItemListener(itemEvent -> {
345 ColorDefaultTableModel model = (ColorDefaultTableModel) colorTable.getModel();
346 IColorTable selectedColorTable = (IColorTable) itemEvent.getItem();
347 model.setDataVector(selectedColorTable.getTableRowData(), selectedColorTable.getColumnNames());
348 onColorTableChanged();
349 });
350
351 IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
352 colorTable = new JTable(new ColorDefaultTableModel(selectedColorTable.getTableRowData(), selectedColorTable.getColumnNames()));
353 JScrollPane colorTableScrollPane = new JScrollPane(colorTable);
354 onColorTableChanged();
355
356 yPanel.add(colorTableTypeComboBox);
357 yPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
358 yPanel.add(colorTableScrollPane);
359 }
360
361 private void onColorTableChanged() {
362 IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
363 int labelIndex = selectedColorTable.getLabelIndex();
364 String labelName = colorTable.getColumnName(labelIndex);
365 colorTable.getColumn(labelName).setCellRenderer(new ColorTableCellRenderer());
366 }
367
368 private class ColorDefaultTableModel extends DefaultTableModel {
369 @Serial
370 private static final long serialVersionUID = 1L;
371
372 public ColorDefaultTableModel(Object[][] data, Object[] columnNames) {
373 super(data, columnNames);
374 }
375
376 @Override
377 public boolean isCellEditable(int row, int column) {
378 return true;
379 }
380 }
381
382 private class ColorTableCellRenderer extends DefaultTableCellRenderer {
383 @Serial
384 private static final long serialVersionUID = 1L;
385
386 @Override
387 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
388 Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
389 IColorTable selectedColorTable = (IColorTable) colorTableTypeComboBox.getSelectedItem();
390 if (selectedColorTable == null) {
391 return renderer;
392 }
393 String hex = (String) colorTable.getValueAt(row, selectedColorTable.getHexIndex());
394 Color color = ColorUtils.hex2Color(hex);
395 renderer.setBackground(color);
396 return renderer;
397 }
398 }
399
400 private void syncToOthersFormat(String colorMode) {
401 if (!colorMode.equalsIgnoreCase("RGB")) {
402 redSpinner.setValue(color.getRed());
403 greenInRgbSpinner.setValue(color.getGreen());
404 blueInRgbSpinner.setValue(color.getBlue());
405 }
406 if (!colorMode.equalsIgnoreCase("HEX")) {
407 hexInRgbTextField.setText(ColorUtils.color2Hex(color));
408 }
409 if (!colorMode.equalsIgnoreCase("HSB")) {
410 int[] hsbArray = ColorUtils.color2Hsb(color);
411 hueInHsbSpinner.setValue(hsbArray[0]);
412 saturationInHsbSpinner.setValue(hsbArray[1]);
413 brightnessInHsbSpinner.setValue(hsbArray[2]);
414 }
415 if (!colorMode.equalsIgnoreCase("HSL")) {
416 int[] hsbArray = ColorUtils.color2Hsl(color);
417 hueInHslSpinner.setValue(hsbArray[0]);
418 saturationInHslSpinner.setValue(hsbArray[1]);
419 lightnessInHslSpinner.setValue(hsbArray[2]);
420 }
421 if (!colorMode.equalsIgnoreCase("CMYK")) {
422 int[] cmykArray = ColorUtils.color2Cmyk(color);
423 cyanInCmykSpinner.setValue(cmykArray[0]);
424 magentaInCmykSpinner.setValue(cmykArray[1]);
425 yellowInCmykSpinner.setValue(cmykArray[2]);
426 blackInCmykSpinner.setValue(cmykArray[3]);
427 }
428 if (!colorMode.equalsIgnoreCase("CIELAB")) {
429 int[] cielabArray = ColorUtils.color2Cielab(color);
430 lInCielabSpinner.setValue(cielabArray[0]);
431 aInCielabSpinner.setValue(cielabArray[1]);
432 bInCielabSpinner.setValue(cielabArray[2]);
433 }
434 colorBoxTextField.setBackground(color);
435
436 colorBoxTextField.setOpaque(true);
437 }
438
439 class RgbChangeListener implements ChangeListener {
440 @Override
441 public void stateChanged(ChangeEvent e) {
442 if (!isChangedByUser) {
443 return;
444 }
445 isChangedByUser = false;
446 int red = (Integer) redSpinner.getValue();
447 int green = (Integer) greenInRgbSpinner.getValue();
448 int blue = (Integer) blueInRgbSpinner.getValue();
449 color = new Color(red, green, blue);
450 syncToOthersFormat("RGB");
451 isChangedByUser = true;
452 }
453 }
454
455 class HsbChangeListener implements ChangeListener {
456 @Override
457 public void stateChanged(ChangeEvent e) {
458 if (!isChangedByUser) {
459 return;
460 }
461 isChangedByUser = false;
462 int hue = (Integer) hueInHsbSpinner.getValue();
463 int saturation = (Integer) saturationInHsbSpinner.getValue();
464 int brightness = (Integer) brightnessInHsbSpinner.getValue();
465 color = ColorUtils.hsb2Color(hue, saturation, brightness);
466 syncToOthersFormat("HSB");
467 isChangedByUser = true;
468 }
469 }
470
471 class HslChangeListener implements ChangeListener {
472 @Override
473 public void stateChanged(ChangeEvent e) {
474 if (!isChangedByUser) {
475 return;
476 }
477 isChangedByUser = false;
478 int hue = (Integer) hueInHslSpinner.getValue();
479 int saturation = (Integer) saturationInHslSpinner.getValue();
480 int lightness = (Integer) lightnessInHslSpinner.getValue();
481 color = ColorUtils.hsl2Color(hue, saturation, lightness);
482 syncToOthersFormat("HSL");
483 isChangedByUser = true;
484 }
485 }
486
487 class CmykChangeListener implements ChangeListener {
488 @Override
489 public void stateChanged(ChangeEvent e) {
490 if (!isChangedByUser) {
491 return;
492 }
493 isChangedByUser = false;
494 int cyan = (Integer) cyanInCmykSpinner.getValue();
495 int magenta = (Integer) magentaInCmykSpinner.getValue();
496 int yellow = (Integer) yellowInCmykSpinner.getValue();
497 int black = (Integer) blackInCmykSpinner.getValue();
498 color = ColorUtils.cmyk2Color(cyan, magenta, yellow, black);
499 syncToOthersFormat("CMYK");
500 isChangedByUser = true;
501 }
502 }
503
504 class CielabChangeListener implements ChangeListener {
505 @Override
506 public void stateChanged(ChangeEvent e) {
507 if (!isChangedByUser) {
508 return;
509 }
510 isChangedByUser = false;
511 int l = (Integer) lInCielabSpinner.getValue();
512 int a = (Integer) aInCielabSpinner.getValue();
513 int b = (Integer) bInCielabSpinner.getValue();
514 color = ColorUtils.cielab2Color(l, a, b);
515 syncToOthersFormat("CIELAB");
516 isChangedByUser = true;
517 }
518 }
519
520 class HexDocumentListener implements DocumentListener {
521 @Override
522 public void insertUpdate(DocumentEvent e) {
523 onValueUpdate();
524 }
525
526 @Override
527 public void removeUpdate(DocumentEvent e) {
528 onValueUpdate();
529 }
530
531 @Override
532 public void changedUpdate(DocumentEvent e) {
533 onValueUpdate();
534 }
535
536 private void onValueUpdate() {
537 if (!isChangedByUser) {
538 return;
539 }
540 isChangedByUser = false;
541 String hex = hexInRgbTextField.getText();
542 try {
543 color = ColorUtils.hex2Color(hex);
544 syncToOthersFormat("HEX");
545 } catch (NumberFormatException e) {
546 logger.error("Invalid hex value: {}", hex);
547 }
548 isChangedByUser = true;
549 }
550 }
551 }